package com.weijian.dal.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.weijian.config.handler.CityListTypeHandler;
import com.weijian.config.handler.JsonbTypeHandler;
import com.weijian.dal.BaseDO;
import com.weijian.dal.enums.City;
import com.weijian.dal.enums.RouteType;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.List;

/**
 * 路线明细实体类
 * 对应数据库表: route
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName(value = "route", autoResultMap = true)
public class Route extends BaseDO {

    /**
     * 路线ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     * 路线原始索引
     */
    private Integer routeId;

    /**
     * 路线类型
     */
    private RouteType routeType;

    /**
     * 节点列表
     */
    // 修改nodes字段，使用专门的CityListTypeHandler处理器
    @TableField(value = "nodes", typeHandler = CityListTypeHandler.class)
    private List<City> nodes;

    /**
     * 成本列表
     */
    @TableField(value = "costs", typeHandler = JsonbTypeHandler.class)
    private List<Double> costs;

    /**
     * 行驶时间列表
     */
    @TableField(value = "travel_times", typeHandler = JsonbTypeHandler.class)
    private List<Double> travelTimes;

    /**
     * 容量
     */
    private Integer capacity;

    /**
     * 剩余容量
     */
    private Integer remainingCapacity;

    /**
     * 总行驶时间
     */
    private Double totalTravelTime;

    /**
     * 总成本
     */
    private Double totalCost;

    /**
     * 数据ID
     */
    private Integer dataId;

    /**
     * 计算路线利用率
     *
     * @return 利用率 (已使用容量 / 总容量)
     */
    public Double getUtilizationRate() {
        if (capacity == null || capacity <= 0) {
            return 0.0;
        }
        if (remainingCapacity == null) {
            return 0.0;
        }
        return (double) (capacity - remainingCapacity) / capacity;
    }

    /**
     * 获取总成本，如果totalCost为null，则根据costs列表计算
     *
     * @return 总成本
     */
    public Double getTotalCost() {
        if (totalCost != null) {
            return totalCost;
        }

        if (costs == null || costs.isEmpty()) {
            return 0.0;
        }

        return costs.stream().mapToDouble(Double::doubleValue).sum();
    }

    /**
     * 获取总行驶时间，如果totalTravelTime为null，则根据travelTimes列表计算
     *
     * @return 总行驶时间
     */
    public Double getTotalTravelTime() {
        if (totalTravelTime != null) {
            return totalTravelTime;
        }

        if (travelTimes == null || travelTimes.isEmpty()) {
            return 0.0;
        }

        return travelTimes.stream().mapToDouble(Double::doubleValue).sum();
    }
}